package com.atguigu.tingshu.album.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.*;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tencentcloudapi.ame.v20190916.models.Album;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private TrackInfoMapper trackInfoMapper;


	/**
	 * 新增专辑
	 * @param albumInfoVo 专辑信息
	 * @param userId 用户id
	 */
	@Override
	@Transactional(rollbackFor = Exception.class) //Spring事务管理默认捕获RuntimeException才会进行事务回滚
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
		// 1. 向专辑信息表中添加一条记录
		// 1.1 先把前端Vo对象中的属性名复制给PO对象
		AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
		// 1.2 手动复制一些属性
		albumInfo.setUserId(userId);
		// 付费类型是非免费的专辑，免费收听集数设置为5 免费收听秒数（暂时不设置）
		if(!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfoVo.getPayType())) {
			albumInfo.setTracksForFree(5);
		}
		//目前没有平台审核端暂时写为通过
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		albumInfoMapper.insert(albumInfo);
		Long albumId = albumInfo.getId();
		// 2. 向专辑属性关系表添加若干条记录
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if(CollectionUtil.isNotEmpty(albumAttributeValueVoList)) {
			albumAttributeValueVoList.forEach(albumAttributeValueVo -> {
				// 复制属性到对应的类中
				AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(albumAttributeValueVo, AlbumAttributeValue.class);
				// 设置关联的专辑id
				albumAttributeValue.setAlbumId(albumId);
				// 新增记录
				albumAttributeValueMapper.insert(albumAttributeValue); // 一条一条插入 MP业务层有提供批量插入逻辑
			});
		}
		// 3. 向专辑状态统计表添加4条记录 播放量 订阅量 购买量 评论数
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_PLAY);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_BUY);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_COMMENT);
	}


	/**
	 * 初始化保存专辑统计信息
	 * @param albumId 专辑ID
	 * @param statType 统计类型
	 */
	@Override
	public void saveAlbumStat(Long albumId, String statType) {
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}

	/**
	 * TODO: 该功能必须用户登录才能真正添加
	 * 查看当前用户专辑分页列表
	 * @param albumPage 分页对象
	 * @param albumInfoQuery 模糊查询字段
	 * @return
	 */
	@Override
	public Page<AlbumListVo> findUserAlbumPage(Page<AlbumListVo> albumPage, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.getUserAlbumPage(albumPage, albumInfoQuery);
	}

	/**
	 * 根据专辑ID删除专辑
	 * 1. 删除专辑album_info中专辑id对应的专辑信息
	 * 2. 删除专辑属性关系表中若干条记录
	 * 3. 删除专辑统计表4条信息
	 * 4. 删除专辑对应的声音列表
	 * @param id 专辑Id
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfo(Long id) {
		// 1. 删除专辑album_info中专辑id对应的专辑信息
		albumInfoMapper.deleteById(id);
		// 2. 删除专辑属性关系表中若干条记录
		LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		lambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId, id);
		albumAttributeValueMapper.delete(lambdaQueryWrapper);
		// 3. 删除专辑统计表4条信息
		LambdaQueryWrapper<AlbumStat> albumStatLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumStatLambdaQueryWrapper.eq(AlbumStat::getAlbumId, id);
		albumStatMapper.delete(albumStatLambdaQueryWrapper);
		// 4. 删除专辑对应的声音列表
		LambdaQueryWrapper<TrackInfo> trackInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
		trackInfoLambdaQueryWrapper.eq(TrackInfo::getAlbumId, id);
		trackInfoMapper.delete(trackInfoLambdaQueryWrapper);
	}

	/**
	 * 根据ID查询专辑信息
	 * @param id 专辑ID
	 * @return
	 */
	@Override
	public AlbumInfo getAlbumInfo(Long id) {
		// 1. 查到对应的专辑信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(id);
		// 2. 封装专辑属性关系信息进去
		LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		lambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId, id);
		List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(lambdaQueryWrapper);
		if(CollectionUtil.isNotEmpty(albumAttributeValues)){
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
		}
		return albumInfo;
	}

	/**
	 * 修改专辑
	 * 1. 根据id修改专辑信息表信息
	 * 2. 删除之前的专辑属性关系表中记录
	 * 3. 添加更新后的专辑属性关系表
	 * @param id 专辑id
	 * @param albumInfoVo 修改后的专辑信息
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) {
		// 1. 根据id修改专辑信息表信息
		AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
		albumInfo.setId(id);
		albumInfoMapper.updateById(albumInfo);
		// 2. 删除之前的专辑属性关系表中记录
		LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		lambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId, id);
		albumAttributeValueMapper.delete(lambdaQueryWrapper);
		// 3. 添加更新后的专辑属性关系表
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if(CollectionUtil.isNotEmpty(albumAttributeValueVoList)) {
			albumAttributeValueVoList.forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(albumAttributeValueVo, AlbumAttributeValue.class);
				albumAttributeValue.setAlbumId(id);
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}
	}

	/**
	 * 获取当前用户全部专辑列表
	 * @return
	 */
	@Override
	public List<AlbumInfo> findUserAllAlumList(Long userId) {
		LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumInfo::getUserId, userId) // 1. 根据用户id查询
				.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle) // 2. 指定查询列 专辑ID 专辑标题
				.orderByDesc(AlbumInfo::getCreateTime) // 3. 根据创建专辑时间降序
				.last("limit 200"); // 4. 限制专辑数量，避免小程序端卡顿
		return albumInfoMapper.selectList(queryWrapper);
	}
}
